﻿#define  _CRT_SECURE_NO_WARNINGS 1
 //scanf()c语言中的输入函数

// 程序运行到这个语句的时候，就会停下来等待用户从键盘输入
// 用户输入数据后，按下回车键，scanf（）就会处理用户的输入，将其存入变量
// 它原型定义在头文件stdio.h
// scanf()的语法与printf类似
// scanf("%d",&i); 表示输入整数存在变量i中 %d表示输入整数
//一次输入多个变量
#include <stdio.h>
/*int main()
{
	int a = 0;
	int b = 0;
	float f1 = 0.0;
	float f2 = 0.0;

	scanf("%d %d %f %f", &a, &b, &f1, &f2);
	printf("%d %d %f %f\n", a, b, f1, f2);
	return 0;
		
}*///scanf 处理占位符的时候会自动忽略空白字符，包括空格，制表符，换行符
//scanf 处理⽤⼾输⼊的原理是，⽤⼾的输⼊先放⼊缓存，等到按下回⻋键后，按照占位符对缓存
//进⾏解读。
//解读⽤⼾输⼊时，会从上⼀次解读遗留的第⼀个字符开始，直到读完缓存，或者遇到第⼀个不符合条
//件的字符为⽌。

//int main()
//{
//	int x;
//	float y;
//	 //用户输入"      -13.45e12# 0"
//	scanf("%d", &x);
//	printf("%d\n", x);//打印出来的x是-13
//	scanf("%f", &y);
//	printf("%f\n", y);//打印出来的y是-13.45e12   0.45e12=0.45*10的12次方 打印出是449999994880.000000
//	//浮点数在内存中有可能无法精确保存 有误差
//		return 0;
//}
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);// 若输入2，3则输出2 0，因为格式不对上，读到逗号的时候就默认后面无
//	//整数了，所以b才输出为0，要下改则这样如下
//	printf("%d %d\n", a, b);
//	return 0;
// }
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d,%d", &a, &b);//注意这个逗号英文要一致
//	printf("%d %d\n", a, b);
//	return 0;
//}

//scanf的返回值是一个整数，若成功则表示成功读取的变量的个数，不成功则为0
//如果没有读取任何项，或者匹配失败，则返回 0 。
//如果在成功读取任何数据之前，发⽣了读取错误或者遇到读取到⽂件结尾，则返回常量 EOF(-1)。
//EOF - end of file ⽂件结束标志
 
//int main()
//{
//	int a = 0;
//	int b = 0;
//	int c = 0;
//	int d = 0;
//	int ret = scanf("%d %d %d %d", &a, &b, &c, &d);//用户输入10 20 30 40
//	printf("a=%d b=%d c=%d d=%d\n", a, b, c, d);// 打印出a=10 b=20 c=30 d=40
//	printf("ret = %d\n", ret);// 打印出ret=4
//	return 0;
//}
//int main()
//{
//	int a = 0;
//	int b = 0;
//	int c = 0;
//	int d = 0;
//	int ret = scanf("%d %d %d %d", &a, &b, &c, &d);//用户输入10 20 30,40
//	printf("a=%d b=%d c=%d d=%d\n", a, b, c, d);// 打印出a=10 b=20 c=30  d=0
//	printf("ret = %d\n", ret);// 打印出ret=3
//	return 0;
	//若想输入两个数就让程序停止，则输入三次Ctrl+z 就可以停止
	//若我上来直接三次Ctrl+z则ret=-1
	//若我上来直接输入，则ret=
//}

//int main()
//{
//	int num = 0;
//	scanf("%d",&num); //就是你输入100和  "  100"最后都会打印出100  除了%c不会这样，其他的
//	printf("%d\n", num);// %d %f %lf %s %[]都会自动忽略起首的空白字符
//	return 0;
//}
//int main()
//{
//	char ch = 0;
//	scanf("%c", &ch);//%c总会返回当前的第一个字符，无论该字符是否为空格
//	printf("xxxx%cyyyy\n", ch);//这时输入a和“  a”输出的分别就是xxxxayyyy和xxxx yyyy
//	return 0;
//} //若想跳过空格则在%c前面加个空格，即scanf（" %c",&ch）;就可以读取的第一个真正的字符了4

//int main()
//{
//	char arr[5] = { 0 }; //数组
//	scanf("%s", arr);//arr是数组名，可以放20个字符，数组名是地址
//	printf("%s\n", arr);//输入hello world 则输出hello
//	return 0;
//}
	//位符 %s ，它其实不能简单地等同于字符串。它的规则是，从当前第⼀个⾮空⽩
	//字符开始读起，直到遇到空⽩字符（即空格、换⾏符、制表符等）为⽌。
//} scanf()遇到%s占位符，会在字符串变量末尾存储一个空字\0
	//scanf() 将字符串读⼊字符数组时，不会检测字符串是否超过了数组⻓度。所以，储存字符串时，
	//很可能会超过数组的边界，导致预想不到的结果。为了防⽌这种情况，使⽤% s 占位符时，应该指定
	//读⼊字符串的最⻓⻓度，即写成% [m]s ，其中的[m] 是⼀个整数，表⽰读取字符串的最⼤⻓度，后
	//⾯的字符将被丢弃

//int main()
//{
//	char name[5] = {0};
//	scanf("%4s", name);
//	printf("%s\n", name);
//		return 0;
//}

//int main()
//{
//	int year = 0;
//	int month = 0;
//	int day = 0;
//	scanf("%d-%d-%d", &year, &month, &day);//若按照格式2025-6-15输入 则输出得到2025 6 15
//	//若没有,若输入的是2025/6/15.则输出的是2025 0 0 
//	printf("%d %d %d\n", year, month, day);
//	return 0;
//	}
//为了避免这种情况出现所以我们用到赋值忽略符%*c
//int main()
//{
//	int year = 0;
//	int month = 0;
//	int day = 0;
//	scanf("%d%*c%d%*c%d", &year, &month, &day);//这样就可以避免出现格式错误的情况了
//	printf("%d %d %d\n", year, month, day);
//		return 0;
//}
//在创建变量的时候，给变量一个初始值是一种好的编程习惯，如果不给变量初始化，有的编译器会报错。
//vs2022严格的编译器就不能这样，如果不初始化，就会报错。
//局部变量不初始化，初始值随机，全局变量不初始化，默认值0
// 
//你的手机丢了，在屏幕上输出信息告诉大家，输出描述l lost my cellphone!
//int main()
//{
//	printf("l lost my ceephone!");
//	return 0;
//}

//int main()
//{
//	printf("Name    Age    Gender\n");
//	printf("---------------------\n");
//	printf("Jack    18     man\n");
//	return 0;
//}

//int main()
//{
//	printf("     **     \n");
//	printf("     **     \n");
//
//	printf("************\n");
//	printf("************\n");
//	printf("    *  *    \n");
//	printf("    *  *    \n");
//
//
//
//	return 0;
//}
//C语言中0表示假 非0表示真
//int main()
//{
//	int num = 10;
//	if (num == 10)//这里不能有；因为接下来的和它也是同一个语句
//	printf("hehe\n"); //hehe
//
//	return 0;
//}   ==是判断相等
//int main()
//{
//	int num = 1;
//	if (num)
//		printf("hehe\n");//hehe  非0为真 若num=0，则打印出来没有东西
//	return 0;
//
//}
//输入一个整数，判断这个整数是否为奇数
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);//输入
//	if (num % 2 == 1)
//		printf("%d 是 奇数\n", num);
//	
//	return 0;
//
//}
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);//输入
//	if (num % 2 == 1)
//		printf("%d 是 奇数\n", num);
//	else
//		printf("%d 是偶数\n", num);
//	return 0;
//
//}

//输入一个年龄，>=18岁则输出：成年，否则输出：未成年

//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (age >= 18)
//		printf("成年\n");
//	else
//		printf("未成年\n");
//	return 0;
//
//}
//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (age >= 18)
//		printf("成年\n");
//        printf("可以谈恋爱了");//报错，else不知道和谁匹配，默认情况下if和else的后边只能跟一条语句
//	else  //若要跟多条语句则用大括号
//		printf("未成年\n");
//	return 0;
//
//}
//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (age >= 18)
//	{
//		printf("成年\n");
//		printf("可以谈恋爱了");
//	}
//	else
//	{
//		printf("未成年\n");
//		printf("不可以恋爱");
//
//	}
//	return 0;
//
//}

//嵌套if 在 if else 语句中， else 可以与另⼀个 if 语句连⽤，构成多重判断。 
// 也可以嵌套if里
//int main()
////判断输入的数是0还是正数还是负数
//{
//	int num = 0;
//	scanf("%d", &num);//输入
//	if (num == 0)
//		printf("输入的值是0\n");//输出和判断
//	else
//	{
//		if (num > 0)
//			printf("输入的值是正数\n");
//		else
//			printf("输入的值是负数");
//	}
//			
//	return 0;  嵌套到else里
//}
//int main()
////判断输入的数是0还是正数还是负数
//{
//	int num = 0;
//	scanf("%d", &num);//输入
//	if (num == 0)
//		printf("输入的值是0\n");//输出和判断
//	else	if (num > 0)
//			printf("输入的值是正数\n");
//	else
//			printf("输入的值是负数");
//	
//
//	return 0;
//}//这样也可以

//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	if (num >= 0)
//	{
//		if (num == 0)
//			printf("输入的值是0\n");
//		else
//			printf("输入的值是正数\n");
//
//	}
//	else
//	{
//		printf("输入的值是负数");
//	}
//	return 0;
//} 也可以 嵌套到if里

 
//输⼊⼀个⼈的年龄
//如果年龄 < 18岁，打印"少年"
//	如果年龄在18岁⾄44岁打印"⻘年"
//	如果年龄在45岁⾄59岁打印"中⽼年"
//	如果年龄在60岁⾄89岁打印"⽼年"
//	如果90岁及以上打印"⽼寿星"

//int main()
//{
//	int age = 0;
//	scanf("%d", &age);//输入
	
	//判断和输出
//	if (age < 18)
//		printf("少年\n");
//	else //age>=18的情况
//
//	{
//		if (age <= 44)//18～44
//			printf("青年\n");
//		else //age>=45
//		{
//			if (age <= 59)
//				printf("中老年\n");
//			else//>=60
//			{
//				if (age <= 89)
//					printf("老年\n");
//				else// >=90
//					printf("老寿星");
//
//			}
//		}
//
//	}
//	//其实这些大括号可以省略
//
//	return 0;
//}
//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (age < 18)
//		printf("少年\n");
//	else if (age <= 44)
//		printf("青年\n");
//	else if (age <= 59)
//		printf("中老年\n");
//	else if (age <= 89)
//		printf("老年\n");
//	else   
//		printf("老寿星");
//	//其实这些大括号可以省略
//
//	return 0;
//}

//如果有多个 if 和 else ，可以记住这样⼀条规则， else 总是跟最接近的 if 匹配。
// 悬空else
//int main()
//{
//	int a = 0;
//	int b = 2;
//	if (a == 1)
//		if (b == 2)
//			printf("hehe\n");
//		else
//			printf("haha\n");
//	return 0;  //打印结果是空  因为else是与上面的if匹配，与最近的
//	//因此以后写代码的时候要注意格式，让读者更加容易读懂
//}
//关系操作符 < > <= >=  ==相等  !=不相等

//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a,&b);
//	if (a >= b)// 8 5 则打印出hehe
//		printf("hehe\n");
//	return 0;
//
//}

//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	if (a == b) //判断a与b是否相等
//		printf("hehe\n");
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b); 
//	if (a = b) //把b赋值给a 貌似我输入3 3也打印出hehe，但是当年输入3 5时
//		printf("hehe\n");//也是打印hehe 因赋值给a，a就是非0，所以为真
//	return 0;
//}

//int main()
//{
//	int a = 3 == 5;
//	printf("%d\n", a); //打印结果就是0 假为0
//	//若改为3 == 3则打印结果是1
//	return 0;
//}
//有时我们错了，但是打印出来还是这个结果，导致我们也没发现
// = ==
//int main()
//{
//	//= ==
//	//当一个变量和一个常量比较相等的时候，应该怎么写呢?
//	//建议把常量放到 == 的左边
//	int a = 5;
//	if (a == 5)//if(a = 5)打印出来也是hehe
//	{
//		printf("hehe\n");
//	}return 0;
//}
//所以我们这样
//int main()
//{
//	int a = 5;
//	if (5 == a)//此时如果写成 =就出错
//		printf("hehe\n");
//	return 0;
//}

//避免多个关系运算符连用的情况
//int main()
//{
//	int a = 3;
//	int b = 7;
//	int c = 4;
//	if (a < b < c) //这个代码是a<b为真那就是1 然后1再与c比较所以还是真,a>b 那么就是假 0 还＜c，所以为真，打印青年
//
//	{
//		printf("hehe\n"); //此时不满足条件，但是打印的依然是hehe
//	}
//
//	return 0;
//}

//应该这样写
//int main()
//{
//	int a = 3;
//	int b = 7;
//	int c = 4;
//	if (a < b && b < c)//这样才是我们想要的
//	printf("hehe\n");
//	return 0;
//}

//我们输入一个年龄，如果年龄在18岁到36岁之间我们就输出青年
//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (18 <= age <= 36)
//		printf("青年\n"); //输入40，依然打印青年，这就是犯了我们刚才所说的错误
//	return 0;
//}
//int main()
//{
//	int age = 0;
//	scanf("%d", &age);
//	if (18 <= age && age <= 36)
//		printf("青年\n"); //应该这样
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d", &a);
//	if (a > 5)
//		printf("b = 3" );
//	else
//	printf("b = -3");
//	/*可以这样替换
//	b = (a > 5 ? 3 : -3);*/
//	return 0;
//}

//条件操作符也叫三⽬操作符，需要接受三个操作数的，形式如下：
// exp1 ? exp2 : exp3
//条件操作符的计算逻辑是：如果 exp1 为真， exp2 计算，计算的结果是整个表达式
// 的结果；如果exp1 为假， exp3 计算，计算的结果是整个表达式的结果。

//使用条件表达式实现找两个数中较大的值。
//int main()
//{
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	int m = (a > b ? a : b);
//	printf("m= %d\n", m);
//	return 0;
//}
//逻辑操作符  
//逻辑取反运算符（改变单个表达式的真假）。
//&& ：逻辑与运算符，就是并且的意思（两侧的表达式都为真，则为真，否则为假）。
//|| ：逻辑或运算符，就是或者的意思（两侧⾄少有⼀个表达式为真，则为真，否则为假）。
//a-非0 !a-0  a-0 !a-1
//int main()
//
//{
//	int flag = 5;
//	scanf("%d", &flag);//
//	if (!flag)  //若！flag为真则打印hehe，即flag为假，要做什么事就可以这样去写
//		//flag输入为0 则打印hehe
//	{
//		printf("hehe\n");
//	}
//	return 0;
//}
//3到五月是春天
//int main()
//{
//	int month = 0;
//	scanf("%d", &month);
//	if (month >= 3 && month <= 5)
//		printf("春天\n");
//	return 0;
//}

//int main()
//{
//	int month = 0;
//	scanf("%d", &month);
//	if (month == 12 || month == 1 || month == 2)
//		printf("冬季\n");
//	return 0;
//}
//判断一个年份，是否是闰年
//能被4整除并且不能被100整除的是闰年
//被400整除的是闰年
//int main()
//{
//	int year = 0;
//	scanf("%d", &year);
//	if (( (year%4==0) && (year%100!=0) ) || (year%400==0))
//		printf("%d是闰年",year);
//	return 0;
//}

//C语⾔逻辑运算符还有⼀个特点，它总是先对左侧的表达式求值，再对右边的表达式求值，
// 这个顺序是保证的。
//如果左边的表达式满⾜逻辑运算符的条件，就不再对右边的表达式求值。
// 这种情况称为“短路”
//像这种仅仅根据左操作数的结果就能知道整个表达式的结果，
// 不再对右操作数进⾏计算的运算称为短
//路求值。
//于&& 操作符来说，左边操作数的结果是0的时候，右边操作数就不再执⾏
//int main()
//{
//	int i = 0, a = 0, b = 2, c = 3, d = 4;
//	i = (a++ && ++b && d++);
//	//a++=0因为是后置++所以先使用a进行赋值也就是0（假）所以后面的也不用算了
// 赋给i也就是假0
//	// 所以输出结果0 1 2 3 4
//	printf("i = %d\n a = %d\n b = %d\n c = %d\n d=%d\n", i, a, b, c, d);
//	return 0;
//}
//int main()
//{
//	int i = 0, a = 1, b = 2, c = 3, d = 4;
//	i = (a++ && ++b && d++);//把a改为1
//	// a++=1先使用后赋值 因为是真所以继续算a++=2 ++b先赋值也就是3 d++先使用也就是4
//	// 所以都是真 所以i=1
//	//输出就是 1 2 3 3 5
//	
//	printf("i = %d\n a = %d\n b = %d\n c = %d\n d=%d\n", i, a, b, c, d);
//	return 0;
//}
// || 操作符的左操作数的结果不为0时，就⽆需执⾏右操作数。
//int main()
//{
//	int i = 0, a = 1, b = 2, c = 3, d = 4;
//	i = (a++ || ++b || d++);
//	//结果 1 2 2 3 4
//	printf("i = %d\n a = %d\n b = %d\n c = %d\n d=%d\n", i, a, b, c, d);
//	return 0;
//}
//int main()
//{
//	int i = 0, a = 0, b = 2, c = 3, d = 4;
//	i = (a++ || ++b || d++);
//	//结果 1 1 3 3 4 到++b的时候已经为真了，所以不用d++
//	printf("i = %d\n a = %d\n b = %d\n c = %d\n d=%d\n", i, a, b, c, d);
//	return 0;
//}
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	if (n % 3 == 0)
//		printf("余数是0\n");
//	else if (n % 3 == 1)
//		printf("余数是1\n");
//	else
//		printf("余数是2\n");
//	return 0;
//}
//使用 switch语句
//switch 后的 expression 必须是整型表达式
// case 后的值，必须是整形常量表达式 不能是变量 比如下面case n就不行
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	switch (n % 3)
//	{
//	case 0:
//		printf("余数为0\n");
//		break;   //break 出去 停止运行
//	case 1:
//		printf("余数为1\n");
//		break;
//	case 2:
//		printf("余数为2\n");
//		break;
//
//	}
//	return 0;
//}
//int main()
//{
//	float n = 0.0;
//	scanf("%f", &n);
//	switch (n )
//	{
//	case 1.0:
//		printf("余数为0\n");//报错，因为这是浮点型
//		break;   //break 出去 停止运行
//	
//
//	}
//	return 0;
//}
//int main()
//{
//	char ch = 0;
//	scanf("%c", &ch);
//	switch (ch)
//	{
//	case 'a':
//		break;  //这样是可以的 字符类型也是归类到整型家族里的,因为字符本质是ASCII码值为整数
//	case 'b':
//		break;
//
//	}
//	return 0;
//}

//输⼊⼀个1~7的数字，打印对应的星期⼏
//例如：
//输⼊：1 输出：星期⼀
//输⼊：2 输出：星期⼆
//输⼊：3 输出：星期三
//输⼊：4 输出：星期四
//输⼊：5 输出：星期五
//输⼊：6 输出：星期六
//输⼊：7 输出：星期天
//int main()
//{    
//	int day = 0;
//	scanf("%d", &day);
//	switch (day)
//	{
//	case 1:
//		printf("星期一\n");
//		break;
//	case 2:
//		printf("星期二\n");
//		break;
//	case 3:
//		printf("星期三\n");
//		break;
//	case 4:
//		printf("星期四\n");
//		break;
//	case 5:
//		printf("星期五\n");
//		break;
//	case 6:
//		printf("星期六\n");
//		break;
//	case 7:
//		printf("星期天\n");
//		break;
//	}
//	return 0;
//}
//如果需求发⽣变化，变为：
//1. 输⼊1~5，输出的是“⼯作⽇”;
//2. 输⼊6~7，输出“休息⽇”
//int main()
//{
//	int day = 0;
//	scanf("%d", &day);
//	switch (day)
//	{
//	case 1:
//	case 2:	
//	case 3:
//	case 4:  case后面不一定都需要＋break 取决你的需求
//	case 5:
//		printf("工作日\n");
//		break;
//	case 6:
//	case 7:
//		printf("休息日\n");
//		break;
//	}
//	return 0;
//}
//在使⽤ switch 语句的时候，我们经常可能遇到⼀种情况，⽐如 switch 后的表达式中的值⽆法匹
//配代码中的 case 语句的时候，这时候要不就不做处理，要不就得在 switch 语句中加⼊
//default ⼦句
//int main()
//{
//	int day = 0;
//	scanf("%d", &day);
//	switch (day)
//	{
//	case 1:
//	case 2:	
//	case 3:
//	case 4:  //case后面不一定都需要＋break 取决你的需求
//	case 5:
//		printf("工作日\n");
//		break;
//	case 6:
//	case 7:
//		printf("休息日\n");
//		break;
//	default:
//		printf("输入错误，输入的值应该在1 - 7的范围内\n");
//		break;
//	}
//	return 0;
//}

//int main()
//{
//	int n = 10;
//	while(n > 0) //一直循环判断n是否大于0，n没变，所以会一直死循环
//		printf("hehe\n");
//		
//	return 0;
//}
